//***************************************************************************//
//*
//* 内容摘要：引用方式的缓存队列
//*	
//* 当前版本：V1.0		
//* 作    者：zhfayuan
//* 完成日期：2016-8-21
//**************************************************************************//
#ifndef PACKETBUFFER_H
#define PACKETBUFFER_H

#include "SDCommDef.h"

#ifdef __cplusplus
extern "C" {
#endif
	
	
#define PRE_ALLOC_SIZE 1


/*!
	\struct T_MyPayloadInfo
 */
typedef struct T_MyPayloadInfo
{
	unsigned short	sPayloadLen;	// payload总长度
	unsigned short	sSequence;		// payload序号，编码时，由编码器提供，RTP发送模块可以重打；解码时，为RTP包序号，可用于指示丢包
	unsigned int	nTimestamp;		// payload时戳，编码时，由编码器提供，RTP发送模块直接使用；解码时，为RTP包时戳，可用于控制显示
	unsigned char	bPayloadType;	// payload类型，由RFC1889定义
	unsigned char	bPayloadLoc;	// payload位置，0：不是帧尾，1：是帧结尾
	unsigned char   ucGroupNo;   /*used by fec 分组编号*/
	unsigned char   ucGroupSize; /*used by fec 当前组大小，即分组包含几个包*/
	unsigned char   ucGroupPos;  /*used by fec 当前包在分组中的位置*/
	unsigned char   ucPad1;  /*填充，结构保持4字节对齐*/
	unsigned char   ucPad2;
	unsigned char   ucPad3;
} T_MyPayloadInfo;



typedef void (* INCREFCOUNT)(void *pPacketBuffer);
typedef void (* DECREFCOUNT)(void *pPacketBuffer);

/********************************************************************************
 * STRUCT NAME : T_PacketBuffer
 * DESCRIPTION : 媒体数据缓冲区结构定义
********************************************************************************/
typedef struct T_PacketBuffer
{
	UINT32			nDataBufSize;				/* DataBuf的大小，获取数据时不能超出此值 */
	void*			pPacketBufMan;				/* 所在的PacketBufMan */
	void*			pNextFree;					/* 下一个空闲的Buffer */
	INCREFCOUNT		incRefCount;				/* 引用计数加一 */
	DECREFCOUNT		decRefCount;				/* 引用计数减一 */
	UINT32			nRefCount;					/* 引用计数 */

	UINT32			nDataLen;					/* 实际获取到的数据长度*/
	UINT32          uRtpHdrLen;
	UINT8			ucHeader[MAX_HEADER_LEN];	/* 留给Sink加头部用 */
	UINT8			ucDataBuf[PRE_ALLOC_SIZE];	/* 实际的媒体数据，这里只分配一个字节，实际使用时可以多分配 */
}T_PacketBuffer;

/********************************************************************************
* 函数名称	: PacketBuffer_Init
* 功能描述	: 初始化PacketBuffer
* 参数说明  : 
*			  输入：pPacketBuffer：媒体数据缓冲区结构
			        nDataBufSize：缓冲区大小
*             输出：无
* 返 回 值	: 无
* 日    期  :
* 修改记录  : 
********************************************************************************/                                                                                                                                               
void PacketBuffer_Init(T_PacketBuffer *pPacketBuffer, INT32 nDataBufSize);

T_PacketBuffer*  New_PacketBuffer();
void Free_PacketBuffer(T_PacketBuffer* pPacketBuffer);

#ifdef __cplusplus
}
#endif
	
#endif /* PACKETBUFFER_H */
